mod bot;
mod types;
mod utils;

use bot::ClmmSniperBot;
use solana_sdk::signature::Keypair;
use std::env;
use dotenv::dotenv;
use anyhow::Result;

#[tokio::main]
async fn main() -> Result<()> {
    // 加载 .env 文件中的环境变量
    dotenv().ok();
    
    // 初始化日志系统
    env_logger::init();
    
    // 从环境变量获取 Helius API 配置
    // Helius 是一个 Solana RPC 提供商，提供 WebSocket 和 HTTP 接口
    let helius_ws_url = env::var("HELIUS_WS_URL")
        .expect("HELIUS_WS_URL environment variable not set");
    let helius_rpc_url = env::var("HELIUS_RPC_URL")
        .expect("HELIUS_RPC_URL environment variable not set");
    
    // 获取钱包私钥
    let private_key = env::var("PRIVATE_KEY")
        .expect("PRIVATE_KEY environment variable not set");
    
    // 获取机器人交易配置
    // 设置每次买入的 SOL 数量
    let buy_amount_sol: f64 = env::var("BUY_AMOUNT_SOL")
        .unwrap_or_else(|_| "0.1".to_string())
        .parse()
        .expect("BUY_AMOUNT_SOL must be a number");
    
    // 设置最小流动性要求（SOL）
    let min_liquidity_sol: f64 = env::var("MIN_LIQUIDITY_SOL")
        .unwrap_or_else(|_| "138.0".to_string())
        .parse()
        .expect("MIN_LIQUIDITY_SOL must be a number");
    
    // 设置最大流动性要求（SOL）
    let max_liquidity_sol: f64 = env::var("MAX_LIQUIDITY_SOL")
        .unwrap_or_else(|_| "150.423".to_string())
        .parse()
        .expect("MAX_LIQUIDITY_SOL must be a number");
    
    // 设置目标利润百分比
    let sell_profit_percentage: f64 = env::var("SELL_PROFIT_PERCENTAGE")
        .unwrap_or_else(|_| "20.0".to_string())
        .parse()
        .expect("SELL_PROFIT_PERCENTAGE must be a number");
    
    // 设置最大持仓时间（分钟）
    let max_holding_time: u64 = env::var("max_holding_time")
        .unwrap_or_else(|_| "8".to_string())
        .parse()
        .expect("max_holding_time must be a number");
    
    // 设置交易计算单元限制
    // 这决定了交易可以使用的计算资源上限
    let compute_unit_limit: u32 = env::var("COMPUTE_UNIT_LIMIT")
        .unwrap_or_else(|_| "101337".to_string())
        .parse()
        .expect("COMPUTE_UNIT_LIMIT must be a number");
    
    // 设置计算单元价格
    // 这决定了交易优先级的费用
    let compute_unit_price: u64 = env::var("COMPUTE_UNIT_PRICE")
        .unwrap_or_else(|_| "4000".to_string())
        .parse()
        .expect("COMPUTE_UNIT_PRICE must be a number");
    
    // 设置止损百分比
    let stop_loss_percentage: f64 = env::var("STOP_LOSS")
        .unwrap_or_else(|_| "5.0".to_string())
        .parse()
        .expect("STOP_LOSS must be a number");
    
    // 将私钥字符串转换为 Solana 密钥对
    let keypair_bytes: Vec<u8> = serde_json::from_str(&private_key)?;
    let keypair = Keypair::from_bytes(&keypair_bytes)?;
    
    // 打印机器人配置信息
    println!("🚀 CLMM狙击机器人配置:");
    println!("- 买入金额: {} SOL", buy_amount_sol);
    println!("- 最小流动性: {} SOL", min_liquidity_sol);
    println!("- 最大流动性: {} SOL", max_liquidity_sol);
    println!("- 卖出利润: {}%", sell_profit_percentage);
    println!("- 最大持仓时间: {} 秒", max_holding_time);
    println!("- 计算单元限制: {}", compute_unit_limit);
    println!("- 计算单元价格: {}", compute_unit_price);
    println!("- 止损比例: {}%", stop_loss_percentage);
    
    // 创建并初始化机器人实例
    let mut bot = ClmmSniperBot::new(
        helius_ws_url,
        helius_rpc_url,
        keypair,
        buy_amount_sol,
        min_liquidity_sol,
        max_liquidity_sol,
        sell_profit_percentage,
        max_holding_time,
        compute_unit_limit,
        compute_unit_price,
        stop_loss_percentage,
    ).await?;
    
    println!("🚀 CLMM狙击机器人已启动，正在监控新池子...");
    
    // 启动机器人
    bot.start().await?;
    
    Ok(())
}
